<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者，助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件，未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\service\cdz;




class YunKuaiChongService {
    // 保存错误信息
    public $error;
    //云快充参数-测试
    protected $sigSecret='8h9sf4zd5cbtlu8x';//云快充测试-签名秘钥（SigSecret）
    private $secret_key = 'bbkwy062pzyjhqmg';//云快充测试-数据加密密钥
    private $iv = 'xgbzfgwz6ki2gm5j';//云快充测试-iv向量
    //云快充参数-正式
    //protected $sigSecret='';//云快充-签名秘钥（SigSecret）
    //private $secret_key = '';//云快充-数据加密密钥
    //private $iv = '';//云快充-i初始化向量（DataSecretIV）
    //var string $method 加解密方法，可通过openssl_get_cipher_methods()获得
    protected $method;
    //var string $options （不知道怎么解释，目前设置为0没什么问题）
    protected $options;

    //本地企业参数-测试
    protected $self_sigSecret='aad6d11d72dd845e';//测试 企业设置-签名秘钥（SigSecret）
    private $self_secret_key = 'a3a3a6af1182fd6d';//测试 企业设置-数据加密秘钥（DataSecret）
    private $self_iv = '51e219cda28fdb19';//测试 企业设置-初始化向量（DataSecretIV）
    //本地企业参数-正式
    //protected $self_sigSecret='';//正式 企业设置-签名秘钥（SigSecret）
    //private $self_secret_key = '';//正式 企业设置-数据加密秘钥（DataSecret）
    //private $self_iv = '';//正式 企业设置-初始化向量（DataSecretIV）


    /**
     * 构造函数
     * @param string $key 密钥
     * @param string $method 加密方式
     * @param string $iv iv向量
     * @param mixed $options 还不是很清楚
     */
    public function __construct($method = 'AES-128-CBC', $options = 0)
    {
        $this->method = $method;
        $this->options = $options;
    }

    /**
     * 加密方法，对数据进行加密，返回加密后的数据
     * @param string $data 要加密的数据
     * @return string
     */
    public function encrypt($data)
    {
        if(is_array($data)) $data = json_encode($data);
        $en = openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);
        //$en = $this->String2Hex($en);
        return $en;
    }

    /**
     * 解密方法，对数据进行解密，返回解密后的数据
     * @param string $data 要解密的数据
     * @return string
     */
    public function decrypt($data)
    {
        //$data = $this->Hex2String($data);
        $de = openssl_decrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);
        if(!is_array($de)) $de = json_decode($de,true);
        return $de;
    }

    /**
     * @param $string
     * @return string
     */
    public function String2Hex($string){
        $hex='';
        /*
        for ($i=0; $i < strlen($string); $i++){
            $hex .= dechex(ord($string[$i]));
        }
        */
        $hex = bin2hex($string);
        return $hex;
    }

    /**
     * @param $hex
     * @return string
     */
    public function Hex2String($hex){
        $string='';
        for ($i=0; $i < strlen($hex)-1; $i+=2){
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
        }
        return $string;
    }

    /**
     * 获取Sig（签名）
     * @param $data
     * @return string
     */
    function getSign($data){
        $strData = $data['OperatorID'].$data['Data'].$data['TimeStamp'].$data['Seq'];
        return strtoupper($this->hmacMd5Data($strData,$this->sigSecret));
    }

    /**
     * 进行HMAC-MD5加密
     * @param $data
     * @return string
     */
    function hmacMd5Data($data,$sigSecret){

        if (function_exists('hash_hmac')) {
            return hash_hmac('md5', $data, $sigSecret);
        }
        $key = (strlen($sigSecret) > 64) ? pack('H32', 'md5') : str_pad($sigSecret, 64, chr(0));
        $ipad = substr($sigSecret,0, 64) ^ str_repeat(chr(0x36), 64);
        $opad = substr($sigSecret,0, 64) ^ str_repeat(chr(0x5C), 64);
        return md5($opad.pack('H32', md5($ipad.$data)));
    }

    /**
     * @param $data
     * @return string
     */
    function hmacMd5Data1($data){
        $b = 64; // byte length for md5
        $key = $this->sigSecret;
        if (strlen($key) > $b) {
            $key = pack("H32",md5($key));
        }
        $key = str_pad($key, $b, chr(0x00));
        $ipad = str_pad('', $b, chr(0x36));
        $opad = str_pad('', $b, chr(0x5c));
        $k_ipad = $key ^ $ipad ;
        $k_opad = $key ^ $opad;
        return strtoupper(md5($k_opad . pack("H32",md5($k_ipad . $data))));
    }

    /***************************  运营商加解密  ************************/

    /**
     * 运营秘钥加密
     * @param $data
     * @return string
     */
    function selfEncrypt($data){
        if(is_array($data)) $data = json_encode($data);
        $en = openssl_encrypt($data, $this->method, $this->self_secret_key, $this->options, $this->self_iv);
        //$en = $this->String2Hex($en);
        return $en;
    }

    /**
     * 运营商解密
     * @param $data
     * @return string
     */
    public function selfDecrypt($data)
    {
        //$data = $this->Hex2String($data);
        $de = openssl_decrypt($data, $this->method, $this->self_secret_key, $this->options, $this->self_iv);
        if(!is_array($de)) $de = json_decode($de,true);
        return $de;
    }

    /**
     * 运营商秘钥生成sign
     * @param $data
     * @return string
     */
    function getSelfSign($data){
        $strData = $data['OperatorID'].$data['Data'].$data['TimeStamp'].$data['Seq'];
        return strtoupper($this->hmacMd5Data($strData,$this->self_sigSecret));
    }

    /**
     * 运营商秘钥生成sign
     * @param $data
     * @return string
     */
    function getSelfBackSign($data){
        $strData = $data['Ret'].$data['Data'].$data['Msg'];
        return strtoupper($this->hmacMd5Data($strData,$this->self_sigSecret));
    }

    /**
     * 请求数据
     * @param $url
     * @param $data
     * @param string $token
     * @param string $method
     * @return int|mixed
     */
    function curlData($url,$data,$token='',$method = "POST"){
        if(is_array($data)) $data = json_encode($data);
        if($token){
            $headerArray = [
                "Content-type:application/json",
            ];
            $headerArray[] = "Authorization:Bearer ".$token;
        }else{
            $headerArray = [
                "Content-type:application/json",
            ];
        }
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        $error = curl_errno($curl);
        curl_close($curl);
        if ($error) {
            return ['code'=>1,'data'=>$error,'msg'=>'获取失败'];
        }
        if(!is_array($output)){
            $backData = json_decode($output,true);
            if(!$backData) $backData = $output;
        }else{
            $backData = $output;
        }
        return ['code'=>0,'msg'=>'获取成功','data'=>$backData];
    }

}
